﻿Imports System.Data.SqlClient
Imports DTO
Imports DTO.EnderecoDTO
Imports DTO.TelefoneDTO



Public Class ClienteDAL

#Region "Métodos"

    ''' <summary>
    ''' Método responsável incluir um cliente na base de dados
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Incluir(cliente As ClienteDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_INSERIR_CLIENTE " & _
                     " @Cpf ,@Nome ,@Email ,@Senha ,@Logradouro ,@Complemento ,@Numero ,@Bairro	" & _
                     " ,@Cidade	 ,@Estado ,@Cep ,@DddCelular ,@NumeroCelular ,@DddTelefone	,@NumeroTelefone"
                     
            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 200).Value = cliente.pNome
                    cmd.Parameters.Add("@Cpf", SqlDbType.VarChar, 11).Value = cliente.pCpf
                    cmd.Parameters.Add("@Senha", SqlDbType.VarChar, 8).Value = cliente.pSenha
                    cmd.Parameters.Add("@Email", SqlDbType.VarChar, 100).Value = cliente.pEmail

                    'Objeto EnderecoDAO
                    cmd.Parameters.Add("@Logradouro", SqlDbType.VarChar, 150).Value = cliente.pEndereco.pLogradouro
                    cmd.Parameters.Add("@Numero", SqlDbType.Char, 5).Value = cliente.pEndereco.pNumero
                    cmd.Parameters.Add("@Bairro", SqlDbType.VarChar, 50).Value = cliente.pEndereco.pBairro
                    cmd.Parameters.Add("@Cidade", SqlDbType.VarChar, 100).Value = cliente.pEndereco.pCidade
                    cmd.Parameters.Add("@Estado", SqlDbType.Char, 2).Value = cliente.pEndereco.pEstado
                    cmd.Parameters.Add("@Cep", SqlDbType.Char, 8).Value = cliente.pEndereco.pCep
                    cmd.Parameters.Add("@Complemento", SqlDbType.VarChar, 20).Value = cliente.pEndereco.pComplemento

                    'Objeto TefoneDAO
                    cmd.Parameters.Add("@DddCelular", SqlDbType.Char, 2).Value = cliente.pTelefone.pDdd
                    cmd.Parameters.Add("@NumeroCelular", SqlDbType.VarChar, 10).Value = cliente.pTelefone.pNumero

                    'Objeto TefoneDAO
                    cmd.Parameters.Add("@DddTelefone", SqlDbType.Char, 2).Value = cliente.pCelular.pDdd
                    cmd.Parameters.Add("@NumeroTelefone", SqlDbType.VarChar, 10).Value = cliente.pCelular.pNumero

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As SqlException
                    'Erro nº 2627 do SQLException indica chave primaria duplicada
                    If ex.Number = 2627 Then
                        Throw New Exception("Já existe um cliente com este CPF cadastrado!")
                    Else
                        Throw ex
                    End If
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para alterar um determinado cliente através de seu CPF
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Alterar(cliente As ClienteDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_ALTERAR_CLIENTE " & _
                     " @Cpf ,@Nome ,@Email ,@Senha ,@Logradouro ,@Complemento ,@Numero ,@Bairro	" & _
                     " ,@Cidade	 ,@Estado ,@Cep ,@DddCelular ,@NumeroCelular ,@DddTelefone	,@NumeroTelefone"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 200).Value = cliente.pNome
                    cmd.Parameters.Add("@Cpf", SqlDbType.VarChar, 11).Value = cliente.pCpf
                    cmd.Parameters.Add("@Senha", SqlDbType.VarChar, 8).Value = cliente.pSenha
                    cmd.Parameters.Add("@Email", SqlDbType.VarChar, 100).Value = cliente.pEmail

                    'Objeto EnderecoDTO
                    cmd.Parameters.Add("@Logradouro", SqlDbType.VarChar, 150).Value = cliente.pEndereco.pLogradouro
                    cmd.Parameters.Add("@Numero", SqlDbType.Char, 5).Value = cliente.pEndereco.pNumero
                    cmd.Parameters.Add("@Bairro", SqlDbType.VarChar, 50).Value = cliente.pEndereco.pBairro
                    cmd.Parameters.Add("@Cidade", SqlDbType.VarChar, 100).Value = cliente.pEndereco.pCidade
                    cmd.Parameters.Add("@Estado", SqlDbType.Char, 2).Value = cliente.pEndereco.pEstado
                    cmd.Parameters.Add("@Cep", SqlDbType.Char, 8).Value = cliente.pEndereco.pCep
                    cmd.Parameters.Add("@Complemento", SqlDbType.VarChar, 20).Value = cliente.pEndereco.pComplemento

                    'Objeto TefoneDTO
                    Dim celular As New TelefoneDTO
                    cmd.Parameters.Add("@DddCelular", SqlDbType.Char, 2).Value = cliente.pCelular.pDdd
                    cmd.Parameters.Add("@NumeroCelular", SqlDbType.VarChar, 10).Value = cliente.pCelular.pNumero

                    'Objeto TefoneDTO
                    Dim telefone As New TelefoneDTO
                    cmd.Parameters.Add("@DddTelefone", SqlDbType.Char, 2).Value = cliente.pTelefone.pDdd
                    cmd.Parameters.Add("@NumeroTelefone", SqlDbType.VarChar, 10).Value = cliente.pTelefone.pNumero

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para excluir o cliente passando como parâmetro o codCliente
    ''' </summary>
    ''' <param name="cpf"></param>
    ''' <remarks></remarks>
    Public Sub Excluir(cpf As String)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_EXCLUIR_CLIENTE " & _
                     " @Cpf"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Cpf", SqlDbType.VarChar, 11).Value = cpf

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="cpf"></param>
    ''' <remarks></remarks>
    Public Function Consultar(cpf As String) As ClienteDTO
        Dim reader As SqlDataReader
        Dim strSql As String
        Dim objCliente As New ClienteDTO
        Dim objTelefone As New TelefoneDTO
        Dim objCelular As New TelefoneDTO
        Dim objEndereco As New EnderecoDTO

        Try
            Using conn As New SqlConnection(My.Settings.Conexao)
                strSql = "SELECT * FROM TB_Cliente WHERE Cpf=@Cpf  AND Ativo=1"
                Using cmd As New SqlCommand(strSql, conn)
                    cmd.Parameters.Add("@Cpf", SqlDbType.VarChar, 11).Value = cpf

                    conn.Open()
                    reader = cmd.ExecuteReader

                    'Se ele encontrou algum registro, preenche o objeto
                    If reader.Read() Then
                        objCliente.pNome = reader.Item("nome")
                        objCelular.pDdd = reader.Item("DddCelular")
                        objCelular.pNumero = reader.Item("NumeroCelular")
                        objCliente.pCpf = reader.Item("cpf")
                        objEndereco.pBairro = reader.Item("Bairro")
                        objEndereco.pCep = reader.Item("Cep")
                        objEndereco.pCidade = reader.Item("Cidade")
                        objEndereco.pComplemento = reader.Item("Complemento")
                        objEndereco.pEstado = reader.Item("Estado")
                        objEndereco.pLogradouro = reader.Item("Logradouro")
                        objEndereco.pNumero = reader.Item("Numero")
                        objCliente.pNome = reader.Item("Nome")
                        objTelefone.pDdd = reader.Item("DddTelefone")
                        objTelefone.pNumero = reader.Item("NumeroTelefone")
                        objCliente.pEmail = reader.Item("Email")
                        objCliente.pSenha = reader.Item("Senha")

                        objCliente.pCelular = objCelular
                        objCliente.pEndereco = objEndereco
                        objCliente.pTelefone = objTelefone
                    Else
                        objCliente = Nothing
                    End If
                    reader.Close()

                End Using
            End Using
            Return objCliente
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Listar() As List(Of ClienteDTO)
        Dim strSQL As String
        Dim reader As SqlDataReader
        Dim objCliente As ClienteDTO
        Dim listaCliente As New List(Of ClienteDTO)


        Using conn As New SqlConnection(My.Settings.Conexao)
            'conn.ConnectionString = My.Settings.StringConexao
            strSQL = "SELECT * FROM cliente WHERE Ativo=1"

            Using cmd As New SqlCommand(strSQL, conn)
                Try
                    'Cria parâmetro

                    conn.Open() 'Abre conexão

                    reader = cmd.ExecuteReader

                    Do While reader.Read
                        'Instacia um novo objeto clsCliente e preenche este obj com info do bd
                        objCliente = New ClienteDTO

                        With objCliente
                            .pNome = reader.Item("nome")
                            .pCelular.pDdd = reader.Item("DddCelular")
                            .pCelular.pNumero = reader.Item("NumeroCelular")
                            .pCpf = reader.Item("cpf")
                            .pEndereco.pBairro = reader.Item("Bairro")
                            .pEndereco.pCep = reader.Item("Cep")
                            .pEndereco.pCidade = reader.Item("Cidade")
                            .pEndereco.pComplemento = reader.Item("Complemento")
                            .pEndereco.pEstado = reader.Item("Estado")
                            .pEndereco.pLogradouro = reader.Item("Logradouro")
                            .pEndereco.pNumero = reader.Item("Numero")
                            .pNome = reader.Item("Nome")
                            .pTelefone.pDdd = reader.Item("DddTelefone")
                            .pTelefone.pNumero = reader.Item("NumeroTelefone")
                            .pEmail = reader.Item("Email")
                            .pSenha = reader.Item("senha")
                        End With

                        'adicionar na lista
                        listaCliente.Add(objCliente)

                    Loop
                    'fecha o cursos
                    reader.Close()

                    Return listaCliente

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function

#End Region

End Class
